/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetofinal;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.print.PrinterException;
import java.beans.PropertyVetoException;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author Will
 */
public class ConsultaCliente extends JInternalFrame{
    
    //CONSTANTE QUE CONTEM A ALTURA DOS TEXTFIELDS
    private final int preferedHeight = 28;
    
    /**
     * DECLARAÇÃO DE VARIÁVEIS GLOBAIS
     */
    
    //Containers
    JPanel jpFrame, jpBusca , jpTabela;
    JScrollPane scrollPane;
    
    //Estilos de borda;
    private Border lowerAttached = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
    
    //Layouts dos containers
    private GridBagLayout gridLayout = new GridBagLayout();
    private BoxLayout bl;
    
    //Labels de campos
    private JLabel lblCodigo, lblNome;
    
    //Inputs de texto
    private JTextField txNome;
    private JFormattedTextField txCodigo;
    
    //Botões
    private JButton btPesquisar, btPrint;
    
    //Tabela de resultados
    private JTable tbPesquisa;
    private DefaultTableModel model;
    
    //Retorna dektop principal para adicionarmos outros JInternalFrames a ele
    public JDesktopPane deskTopPane;
    
    public ConsultaCliente(){
        initComponents();
    }

    public ConsultaCliente(String strName, JDesktopPane deskTopPane){
        super(strName);
        this.deskTopPane = deskTopPane;
        initComponents();
    }
    
    private void initComponents() {
        setClosable(true);
        setMaximizable(true);
        setIconifiable(true);
        setResizable(true);
        setVisible(true);
        
        //INICIA O PAINEL PRINCIPAL
        jpFrame = new JPanel();
        jpFrame.setBorder(BorderFactory.createEmptyBorder(10,10,20,10));
        bl = new BoxLayout(jpFrame, BoxLayout.PAGE_AXIS);
        jpFrame.setLayout(bl);
        //Invoca o método para criar as opções de busca
        criaCamposBusca();
        //Adiciona um espaçamento entre os containers dentro do jpframe
        jpFrame.add(Box.createRigidArea(new Dimension(0, 30)));
        //Invoca o mpetodo para criar a tabela de resultados
        criTabelaBusca();
        add(jpFrame);
        pack();
    }
    
    /**
     * Método que cria o container com os campos de busca
     */
    public void criaCamposBusca(){
        jpBusca = new JPanel();
        jpBusca.setLayout(gridLayout);
        jpBusca.setBorder(lowerAttached);
        
        lblCodigo   = new JLabel("Código: ");
        lblNome     = new JLabel("Nome: ");
        txCodigo    = new JFormattedTextField(createFormatter("####"));
        txCodigo.setFocusLostBehavior(JFormattedTextField.COMMIT);
        txCodigo.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {
                //TODO
            }

            @Override
            public void focusLost(FocusEvent e) {
                if(!txCodigo.getText().trim().equals("")){
                    DecimalFormat quatroDigitos = new DecimalFormat("0000");
                    String vlCodigoAux = quatroDigitos.format(Integer.parseInt(txCodigo.getText().trim()));
                    txCodigo.setText(vlCodigoAux);
                }
            }
        });
        txCodigo.setPreferredSize(new Dimension(60, preferedHeight));
        txNome      = new JTextField();
        txNome.setPreferredSize(new Dimension(300, preferedHeight));
        btPesquisar = new JButton("Pesquisar");
        
        btPesquisar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                retornaBusca();
            }
        });
        
        btPrint = new JButton("Imprimir");
        btPrint.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(tbPesquisa.getRowCount() > 0){
                    try{
                        boolean complete = tbPesquisa.print();
                        if(complete){
                            JOptionPane.showMessageDialog(null, "Impressão concluida!", "Aviso", JOptionPane.INFORMATION_MESSAGE);
                        }else{
                           JOptionPane.showMessageDialog(null, "Houve Interrupçao na impressão", "Aviso", JOptionPane.WARNING_MESSAGE); 
                        }
                    }catch(PrinterException pe){
                        JOptionPane.showMessageDialog(null, pe.toString(), "Aviso", JOptionPane.WARNING_MESSAGE);
                    }
                }else{
                    JOptionPane.showMessageDialog(null, "Nenhum dado na tabela para impressão.", "Aviso", JOptionPane.WARNING_MESSAGE);
                }
            }
        });
        
        JLabel[] labels = {lblCodigo, lblNome};
        JTextField[] textFields = {txCodigo, txNome};
        
        addLabelTextRows(labels, textFields, btPesquisar, jpBusca);
        jpFrame.add(jpBusca);
    }
    
    /**
     * Método que cria o container da tabela com os resultados da busca
     */
    public void criTabelaBusca(){
        
        jpTabela = new JPanel();
        jpTabela.setBorder(BorderFactory.createEmptyBorder(10,10,20,10));
        BoxLayout blTabela = new BoxLayout(jpTabela, BoxLayout.PAGE_AXIS);
        jpTabela.setLayout(blTabela);
        jpTabela.setBorder(lowerAttached);
        
        //EXEMPLO DE JTABLE
        //List dados      = new ArrayList();
        String[] cabecalho = new String[] {"Editar", "Código", "Nome", "Endereço", "Sexo"};
        Object[][] dados =  new Object[][] {};
        
        //Criamos um modelo para manipular os dados da tabela6
        model = new DefaultTableModel(dados, cabecalho);
        
        tbPesquisa = new JTable(model);
        tbPesquisa.setFillsViewportHeight(true);
        tbPesquisa.setRowHeight(28);
        
        TableColumn colCodigo = tbPesquisa.getColumnModel().getColumn(0);
        colCodigo.setMinWidth(10);
        colCodigo.setPreferredWidth(10);
        
        scrollPane = new JScrollPane(tbPesquisa);
        jpTabela.add(scrollPane);
        jpFrame.add(jpTabela);
        
    }
    
    public void retornaBusca(){
        
        //Remove os dados da tabela
        limpaDadosTabela();
        
        //Obtem o valor dos filtros de busca
        String vlCodigo = txCodigo.getText().trim();
        String vlNome   = txNome.getText().trim();
        
        //Instancia a classe do banco de dados;
        BancoDados bd = new BancoDados();
        
        //Faz a consulta no banco
        ResultSet rs = bd.pesquisaClientes(vlCodigo, vlNome);
        
        URL imgUrl = getClass().getResource("../imgs/icones/cliente.gif");
        try{
            while(rs.next()){
                
                String sexo;
                if(rs.getString("sexo").equals("M")){
                    sexo = "Masculino";
                }else{
                    sexo = "Feminino";
                }
                
                Object[] linha = new Object[] {"",rs.getString("codigo"),rs.getString("nome"),
                    rs.getString("endereco"),sexo};
                model.addRow(linha);
            }
        }catch(SQLException sqlex){
            JOptionPane.showMessageDialog(null, sqlex.toString(), "Aviso", JOptionPane.WARNING_MESSAGE);
        }
        
        Action editCliente = new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
                //Referenciamos a tabela para obter seus valores
                JTable table = (JTable)e.getSource();
                Object vlCodigo;
                //Recuperamos o valor do campo código da tabela em forma de objeto
                vlCodigo = table.getValueAt(table.getSelectedRow(), 1);
                //Instanciamos uma nova tela de edição de dados
                CadastroCliente cliente = new CadastroCliente("Edição de cliente", vlCodigo);
                deskTopPane.add(cliente);                
                cliente.moveToFront();
                try{
                    cliente.setSelected(true);
                }catch(PropertyVetoException pve){
                    System.out.println(pve.toString());
                }
            }
        };
        //ButtonColumn btnCliente = new ButtonColumn(tbPesquisa, null, 0);
        ButtonColumn btnCliente = new ButtonColumn(tbPesquisa, editCliente, 0, imgUrl);
        
        //TableButton btnCliente = new TableButton("", imgUrl);
    }
    
    /**
     * Limpa os dados da tabela
     */
    public void limpaDadosTabela(){
        model.setNumRows(0);
    }
    
    /**
     * Método que adiciona uma linha com um conjunto de labels e seus respectivos textfields
     * @param label[]
     * @param textField[]
     * @param buttonField 
     * @param container 
     */
    private void addLabelTextRows(JLabel[] label,
                                  JTextField[] textField,
                                  JButton buttonField,
                                  Container container) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
        
        //Adiciona os labels e os textfields
        for(int i = 0; i < label.length; i++){
            container.add(label[i], c);
            container.add(textField[i], c);
        }
        
        //Adiciona o botão
        container.add(buttonField, c);
        container.add(btPrint, c);
    }
    
    /**
     * Cria a máscara para formatar campos
     * @param s
     * @return MaskFormatter formatter || null
     */
    public MaskFormatter createFormatter(String s) {
        MaskFormatter formatter = null;
        try {
            formatter = new MaskFormatter(s);
        } catch (java.text.ParseException exc) {
            System.err.println("Formato incorreto: " + exc.getMessage());
        }
        return formatter;
    }
    
    //Retorna o dektop principal
    public JDesktopPane returnMainDeskTop(){
        return this.deskTopPane;
    }
    
}
